#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 1.写出三元运算的基本格式及作用？
'''
info = {'name': None}
name = 'glacier'
info['name'] = 'glacier' if 'glacier' == 'glacier' else False
'''

# 2.什么是匿名函数？
'''
匿名函数：iambda函数，是函数的一种简化语法，不管多复杂只能有一行语句，并且结果作为返回值返回。
num = lambda x, y: x ** y     # 匿名函数的格式 iambda 形参: 计算公式,也是返回值
print(num(2, 8))
'''

# 3.尽量多的列举你了解的内置函数？【默写】
'''
强制转换：
int/bool/str/list/tuple/dice/set/float
数学相关：
max/min/abs/sum/round/pow/divmod
进制相关：
bin/oct/int/hex
编码相关：
chr/ord
输入输出：
print/input
其他：
len/range/id/open/type
高级函数：
map/filter/reduce

输入输出：
print/input
强制转换：
int/bool/str/list/tuple/dict/set/float
数学相关：
max/min/sum/round/pow/divmod/abs
进制相关：
bin/oct/int/hex
编码相关：
chr/ord
高级函数：
map/filter/reduce
其他：
len/range/id/type/open
'''

# 4.filter/map/reduce函数的作用分别是什么？
'''
map:
将一个可迭代序列（字符串、列表、元组、字典的值、集合）的元素，依次循环做相同的操作并添加到一个新的列表并返回。
filter：
将一个可迭代序列（字符串、列表、元组、字典的值、集合）的元素，依次循环，将返回值为True的元素添加到一个新的列表并返回。
reduce：
将一个可迭代序列（字符串、列表、元组、字典的值、集合）的元素，先计算前两个值，保留计算结果，与序列的第三个值进行计算
，以此类推，将所有值合成一个新的值（字符串，整数）并返回。
'''

# 5.看代码写结果
'''
def func(*args,**kwargs):
    print(args,kwargs)
    
# a. 执行 func(12,3,*[11,22]) ，输出什么？ # 12 3 11 22
# b. 执行 func(('alex','武沛齐',),name='eric') # alex 武沛齐  {'name' = 'eric'}
'''

# 6. 看代码分析结果
'''
def func(arg):
    return arg.pop(1)

result = func([11,22,33,44])
print(result) # 22
'''

# 7.看代码分析结果
'''
func_list = []

for i in range(10):
    func_list.append(lambda :i)

v1 = func_list[0]()
v2 = func_list[5]()
print(v1,v2) # 9 9
'''

# 8.看代码分析结果
'''
func_list = []

for i in range(10):
    func_list.append(lambda x:x+i)

v1 = func_list[0](2)
v2 = func_list[5](1)
print(v1,v2) # 11 10
'''

# 9.看代码分析结果
'''
func_list = []

for i in range(10):
    func_list.append(lambda x:x+i)

for i in range(0,len(func_list)):
    result = func_list[i](i)
    print(result) # 0 2 4 6 8 10 12 14 16 18
'''

# 10.看代码分析结果
'''
def f1():
    print('f1')

def f2():
    print('f2')
    return f1

func = f2() # f2
result = func() # f1
print(result) # None
'''

# 11.看代码分析结果【面试题】
'''
def f1():
    print('f1')
    return f3()

def f2():
    print('f2')
    return f1

def f3():
    print('f3')

func = f2() # f2
result = func() # f1 f3
print(result) # None
'''

# 12.看代码分析结果
'''
name = '景女神'

def func():
    def inner():
        print(name)
    return inner()

v = func() # 景女神
print(v) # None
'''

# 13.看代码分析结果
'''
name = '景女神'

def func():
    def inner():
        print(name)
        return "老男孩"
    return inner()

v = func() # 景女神
print(v) # 老男孩
'''

# 14.看代码分析结果
'''
name = '景女神'

def func():
    def inner():
        print(name)
        return '老男孩'
    return inner

v = func()
result = v() # 景女神
print(result) # 老男孩
'''

# 15.看代码分析结果
'''
def func():
    name = '武沛齐'
    def inner():
        print(name)
        return '老男孩'
    return inner

v1 = func() 
v2 = func() 
print(v1,v2) # v1 v2 同时指向inner，但保存在两个不同的内存地址，互不影响
'''

# 16看代码写结果
'''
def func(name):
    def inner():
        print(name)
        return '老男孩'
    return inner

v1 = func('金老板')
v2 = func('alex')
print(v1,v2) # v1 内存地址指向inner，name = '金老板'，v2 内存地址指向inner，父级变量 name = 'alex'
'''

# 17.看代码写结果
'''
def func(name=None):
    if not name:
        name= '武沛齐'
    def inner():
        print(name)
        return '老男孩'
    return inner

v1 = func() 
v2 = func('alex')
print(v1,v2) # v1 内存指向inner，name = '武沛齐'， v2 内存地址指向inner，父级变量 name = 'alex'
'''

# 18.看代码写结果【面试题】
'''
def func(name):
    v = lambda x:x+name
    return v

v1 = func('武沛齐') 
v2 = func('alex')
v3 = v1('银角')
v4 = v2('金角')
print(v1,v2,v3,v4)  # v1 指向 v 指向 lambda的内存地址，父级变量 name = '武沛齐'，
                    # v2 指向 v 指向 lambda的内存地址，父级变量 name = 'alex'，
                    # 银角武沛齐
                    # 金角alex
'''

# 19.看代码写结果
'''
NUM = 100
result = []
for i in range(10):
    func = lambda : NUM      # 注意：函数不执行，内部代码不会执行。
    result.append(func)

print(i) # 9
print(result) # [func,func,func,func,func,func,func,func,func,func]
v1 = result[0]() # v1 = 100
v2 = result[9]() # v2 = 100
print(v1,v2) # 100 100
'''

# 20.看代码写结果【面试题】
'''
result = []
for i in range(10):
    func = lambda : i      # 注意：函数不执行，内部代码不会执行。
    result.append(func)

print(i) # 9
print(result) # [func,func,func,func,func,func,func,func,func,func]
v1 = result[0]() # v1 = 9
v2 = result[9]() # v2 = 9
print(v1,v2) # 9 9
'''

# 21.看代码分析结果【面试题】
'''
def func(num):
    def inner():
        print(num)
    return inner

result = []
for i in range(10):
    f = func(i)
    result.append(f)

print(i) # 9
print(result)   # [inner,inner,inner,inner,inner,inner,inner,inner,inner,inner]
                # [num = 0,num = 1,num = 2,num = 3,num = 4,num = 5,num = 6,num = 7,num = 8,num = 9]
v1 = result[0]() # 0
v2 = result[9]() # 9
print(v1,v2) # None None
'''

# 22.程序设计题
# 启动程序让用户选择进行商品管理 或 会员管理
# 用户选择 【1】 则进入商品管理页面，进入之后显示商品管理相关的菜单
# 用户选择【2】则提示此功能不可用，正在开发中，让用户重新选择。
# 如果用户在【商品管理】中选择【1】，则按照分页去文件 goods.txt 中读取所有商品，并全部显示出来【分页功能可选】。
# 如果用户在【商品管理】中选择【2】，则让提示让用户输入关键字，输入关键字后根据商品名称进行模糊匹配
# 如果用户在【商品管理】中选择【3】，则提示让用户输入商品名称、价格、数量 然后写入到 goods.txt 文件

# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^翻页功能有BUG（暂不使用）^^^^^^^^^^^^^^^^^^^^^^
'''
# ################读取商品列表###############
def goods_list(k=None):
    with open('goods.txt', 'r', encoding='utf-8') as f:
        keys = f.readline().strip().split(',')
        values = list()
        for line in f:
            values.append(line.strip().split(','))
    # total = len(values)     # 翻页功能有bug（暂不开放）
    # pager_count = 5
    # pager_max, pager_num = divmod(total, pager_count)
    # if pager_num > 0:
    #     pager_max += 1
    while True:
        # pager = input('请你要查看的页数（共%s页）（N返回上一级）：' % pager_max)
        # if pager.upper() == 'N':
        #     return
        # if not pager.isdecimal():  # 如果不是数字输出
        #     print('页码不正确，请输入1 - %s页' % pager_max)
        #     continue
        # elif int(pager) > pager_max or int(pager) < 1:  # 如果页数不对输出
        #     print('页码不正确，请输入1 - %s页' % pager_max)
        #     continue
        # start = (int(pager) - 1) * pager_count
        # end = int(pager) * pager_count
        # data = values[start:end]
        if k:  # 如果有关键字，则进入关键字筛选值
            key = input('请输入关键字（N返回上一级）：')
            if key.upper() == 'N':
                return
            print('\n\n\n')
            print(keys[0], keys[1], keys[2])
            for value in values:
                if key in value[0]:
                    print(value[0], value[1], value[2])
        else:  # 否则打印所有商品列表
            print('\n\n\n')
            print(keys[0], keys[1], keys[2])
            # for value in data:
            #     print(value)
            for value in values:
                print(value[0], value[1], value[2])
            return


# ################写入商品列表###############
def write_to_list():
    while True:
        goods = input('请输入商品名（N返回上一级）：')
        if goods.upper() == 'N':
            return
        price = input('请输入价格：')
        amount = input('请输入数量：')
        with open('goods.txt', 'a', encoding='utf-8') as f:
            f.write('\n' + goods + ',' + str(price) + ',' + str(amount))
        print('写入成功')


# 商城菜单
while True:
    print('欢迎使用glacier的商城'.center(50, '*'))
    print('1.商品管理')
    print('2.会员管理（不可选，正在开发中）')
    num = input('请选择（N退出）：')
    if num.upper() == 'N':
        break
    elif num == '1':  # 进入商品管理列表
        while True:
            print('欢迎使用glacier的商城 【商品管理】'.center(50, '*'))
            print('1.查看商品列表')
            print('2.根据关键字搜索指定商品')
            print('3.录入商品')
            num = input('请选择（N返回上一级）：')
            if num.upper() == 'N':
                break
            elif num == '1':
                goods_list()
            elif num == '2':
                goods_list(1)
            elif num == '3':
                write_to_list()
    elif num == '2':
        print('\n\n\n', '此功能不可用，正在开发中！')
        continue
    else:
        print('输入有误，请重新输入')
        continue
'''


# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%翻页功能完善版本%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'''
# ################翻页功能##################
def page_turning(values):
    total = len(values)  # 翻页功能有bug（暂不开放）
    pager_count = 5
    pager_max, pager_num = divmod(total, pager_count)
    if pager_num > 0:
        pager_max += 1
    print(KEYS[0], KEYS[1], KEYS[2])
    for value in values[0:5]:
        print(value)
    while True:
        pager = input('请你要查看的页数（共%s页）（N返回上一级）：' % pager_max)
        if pager.upper() == 'N':
            return
        if not pager.isdecimal():  # 如果不是数字输出
            print('页码不正确，请输入1 - %s页' % pager_max)
            continue
        elif int(pager) > pager_max or int(pager) < 1:  # 如果页数不对输出
            print('页码不正确，请输入1 - %s页' % pager_max)
            continue
        start = (int(pager) - 1) * pager_count
        end = int(pager) * pager_count
        data = values[start:end]
        print(KEYS[0], KEYS[1], KEYS[2])
        for value in data:
            print(value)


# ################读取商品列表###############
def goods_list(k=None):
    with open('goods.txt', 'r', encoding='utf-8') as f:
        global KEYS
        KEYS = f.readline().strip().split(',')
        values = list()
        for line in f:
            values.append(line.strip().split(','))
    while True:
        if k:  # 如果有关键字，则进入关键字筛选值
            key = input('请输入关键字（N返回上一级）：')
            if key.upper() == 'N':
                return
            keys_values = list()
            count = len(values)
            for value in values:
                if key in value[0]:
                    keys_values.append(value)
                else:
                    count -= 1
            if count == 0:
                print('关键字不存在')
                continue
            page_turning(keys_values)
        else:  # 否则打印所有商品列表
            page_turning(values)
            return


# ################写入商品列表###############
def write_to_list():
    while True:
        goods = input('请输入商品名（N返回上一级）：')
        if goods.upper() == 'N':
            return
        price = input('请输入价格：')
        amount = input('请输入数量：')
        with open('goods.txt', 'a', encoding='utf-8') as f:
            f.write('\n' + goods + ',' + str(price) + ',' + str(amount))
        print('写入成功')


KEYS = list()
# 商城菜单
while True:
    print('欢迎使用glacier的商城'.center(50, '*'))
    print('1.商品管理')
    print('2.会员管理（不可选，正在开发中）')
    num = input('请选择（N退出）：')
    if num.upper() == 'N':
        break
    elif num == '1':  # 进入商品管理列表
        while True:
            print('欢迎使用glacier的商城 【商品管理】'.center(50, '*'))
            print('1.查看商品列表')
            print('2.根据关键字搜索指定商品')
            print('3.录入商品')
            num = input('请选择（N返回上一级）：')
            if num.upper() == 'N':
                break
            elif num == '1':
                goods_list()
            elif num == '2':
                goods_list(1)
            elif num == '3':
                write_to_list()
    elif num == '2':
        print('\n\n\n', '此功能不可用，正在开发中！')
        continue
    else:
        print('输入有误，请重新输入')
        continue
'''